package tool

import (
	"fmt"
	"net/url"
	"os"
	"path"
	"path/filepath"
	"strings"
)

func CurrentDir(joinPath ...string) (string, error) {
	if len(joinPath) == 0 {
		dir, err := filepath.Abs(filepath.Dir(os.Args[0]))
		if err != nil {
			return "", fmt.Errorf("failed to get current directory: %w", err)
		}
		return strings.Replace(dir, "\\", "/", -1), nil
	}

	dir, err := filepath.Abs(filepath.Dir(os.Args[0]))
	if err != nil {
		return "", fmt.Errorf("failed to get current directory: %w", err)
	}

	// 确保路径使用正斜杠
	p := strings.Replace(dir, "\\", "/", -1)

	// 使用filepath.Join处理所有路径部分
	whole := filepath.Join(joinPath...)
	whole = filepath.Join(p, whole)

	return whole, nil
}

func ResolveURL(u *url.URL, p string) string {
	if u == nil {
		return p
	}

	if p == "" {
		return u.String()
	}

	// 检查是否是完整的URL
	if strings.HasPrefix(p, "https://") || strings.HasPrefix(p, "http://") {
		return p
	}

	var baseURL string
	if strings.Index(p, "/") == 0 {
		// 如果路径以/开头，使用主机作为基础URL
		baseURL = u.Scheme + "://" + u.Host
	} else {
		// 否则使用当前URL的目录作为基础URL
		tU := u.String()
		lastIndex := strings.LastIndex(tU, "/")
		if lastIndex == -1 {
			// 如果没有找到/，则使用整个URL作为基础
			baseURL = tU
		} else {
			baseURL = tU[0:lastIndex]
		}
	}

	// 使用path.Join确保路径格式正确
	return baseURL + path.Join("/", p)
}

func DrawProgressBar(prefix string, proportion float32, width int, suffix ...string) {
	if width <= 0 {
		width = 50 // 默认宽度
	}

	if proportion < 0 {
		proportion = 0
	} else if proportion > 1 {
		proportion = 1
	}

	pos := int(proportion * float32(width))

	// 构建进度条字符串
	progressBar := strings.Repeat("■", pos) + strings.Repeat(" ", width-pos)

	// 构建后缀字符串
	suffixStr := strings.Join(suffix, "")

	// 格式化输出
	s := fmt.Sprintf("[%s] %s %6.2f%% %s", prefix, progressBar, proportion*100, suffixStr)

	// 输出到控制台，使用\r回到行首
	fmt.Print("\r" + s)

	// 如果进度完成，换行
	if proportion >= 1 {
		fmt.Println()
	}
}
